// 对axios的二次封装 请求和响应拦截器
import axios, {
  AxiosInstance,
  InternalAxiosRequestConfig,
  AxiosResponse,
} from 'axios'
import { ElMessage } from 'element-plus'
import useUserStore from '@/store/modules/user.ts'

let axiosInstance: AxiosInstance = axios.create({
  // 基础路径
  baseURL: import.meta.env.VITE_APP_BASE_API,
  timeout: 5000, // 超时时间设置
})

// axios添加请求或响应拦截器
axiosInstance.interceptors.request.use(
  (config: InternalAxiosRequestConfig<any>) => {
    // config配置对象，有个headers请求头对象，通过请求头可以给服务器携带所需要的参数
    let userStore = useUserStore()
    if (userStore.token) {
      config.headers.token = userStore.token
    }
    // 返回配置对象
    return config
  },
)

// 响应拦截器
axiosInstance.interceptors.response.use(
  (response: AxiosResponse<any, any>) => {
    // 成功的回调

    return response.data
  },
  (error) => {
    // 错误的回调
    // 提示信息
    let message: string = ''
    // http错误状态码
    let status = error.response.status

    switch (status) {
      case 401:
        message = 'TOKEN 过期'
        break
      case 403:
        message = '没有访问权限'
        break
      case 404:
        message = '请求地址错误！'
        break
      case 500:
        message = '服务器错误'
        break
      default:
        message = '网络问题'
    }
    ElMessage({
      type: 'error',
      message,
    })
    return Promise.reject(error)
  },
)

export default axiosInstance
